home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Grand Slam 3
/
Grand Slam 3.iso
/
023
/
soundss3.arj
/
CINTSS3.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-11
|
6KB
|
254 lines
//
//===========================================================================
//
// C-interface for SoundSystem3
//
// Written for Borland C 3.1 & Tasm 3.1
//
// (pd)1995 by the Frontman of Crew242
//
//
// .model MEDIUM
//
//===========================================================================
//
/***************************************************************************
Player definitions
***************************************************************************/
#include <dos.h>
extern void far MAIN0(void); // auto-detection
extern void far MAIN1(void);
extern void far MAIN2(void);
extern void far MAIN3(void);
extern void far MAIN4(void);
int near call_function(int player,int func,int param_ax,int param_bx,int param_cx,int param_dx,int param_ds,int *handle,int *param);
typedef struct pblock
{ int baseport;
char dma_number;
char irq_number;
unsigned int samplerate;
char intern_type;
char irq_type;
char start_pos;
char loop_pos;
char song_mod;
unsigned char master_vol;
unsigned char music_vol;
unsigned char fx_vol;
};
/***************************************************************************
Player functions
***************************************************************************/
int autodetect(struct pblock *paramblock)
{ int handle, param;
call_function(0,0,0,FP_OFF(paramblock),0,0,FP_SEG(paramblock),&handle,¶m);
return handle;
}
int config_init(int player, int code, struct pblock *paramblock)
{ int c, handle, param;
c= call_function(player,1,0,FP_OFF(paramblock),code,0,FP_SEG(paramblock),&handle,¶m);
return c;
}
int load_mod(int player, char *filename)
{ int c, handle, param;
c= call_function(player,2,0,0,0,FP_OFF(filename),FP_SEG(filename),&handle,¶m);
return c;
}
int play_music(int player)
{ int c, handle, param;
c= call_function(player,3,0,0,0,0,0,&handle,¶m);
return c;
}
int stop_music(int player)
{ int c, handle, param;
c= call_function(player,4,0,0,0,0,0,&handle,¶m);
return c;
}
int end_music(int player)
{ int c, handle, param;
c= call_function(player,5,0,0,0,0,0,&handle,¶m);
return c;
}
int load_sample(int player, char *filename, int amiga_pc, int *handle)
{ int c, param;
c= call_function(player,6,0,0,amiga_pc & 0x80,FP_OFF(filename),FP_SEG(filename),handle,¶m);
return c;
}
int play_sample(int player, int handle, int freq_in_hz, int panning)
{ int c, param;
c= call_function(player,7,panning & 255,handle,freq_in_hz,0,0,&handle,¶m);
return c;
}
int end_sample(int player)
{ int c, handle, param;
c= call_function(player,8,0,0,0,0,0,&handle,¶m);
return c;
}
int set_samplerate(int player, int freq_in_hz)
{ int c, handle, param;
c= call_function(player,9,freq_in_hz,0,0,0,0,&handle,¶m);
return c;
}
int get_volume(int player, int *master_vol, int *music_vol, int *fx_vol)
{ int c, handle, param;
c= call_function(player,10,0,0,0,0,0,&handle,¶m);
*master_vol= handle & 255;
*music_vol= param & 255;
*fx_vol= param >> 8;
return c;
}
int set_volume(int player, int master_vol, int music_vol, int fx_vol)
{ int c, handle, param;
c= call_function(player,11,master_vol & 255,(fx_vol << 8)+(music_vol & 255),0,0,0,&handle,¶m);
return c;
}
int set_songloop(int player, int loop_position)
{ int c, handle, param;
c= call_function(player,12,loop_position & 255,0,0,0,0,&handle,¶m);
return c;
}
int get_songposition(int player, int *song_position)
{ int c, handle, param;
c= call_function(player,13,0,0,0,0,0,&handle,¶m);
*song_position= handle & 127;
return c;
}
int set_songposition(int player, int song_position)
{ int c, handle, param;
c= call_function(player,14,song_position & 127,0,0,0,0,&handle,¶m);
return c;
}
int get_songmod(int player, int *song_modus)
{ int c, handle, param;
c= call_function(player,15,0,0,0,0,0,&handle,¶m);
*song_modus= handle & 3;
return c;
}
int set_songmod(int player, int song_modus)
{ int c, handle, param;
c= call_function(player,16,song_modus & 3,0,0,0,0,&handle,¶m);
return c;
}
/***************************************************************************
Player interface subroutines
***************************************************************************/
int near call_function(int player,int func,int param_ax,int param_bx,int param_cx,int param_dx,int param_ds,int *handle,int *param)
{ int c,ra,rb,rc;
switch(player){
case 0:
{asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
mov ax,param_ax /* SI AND DI AS TEMP VAR */
mov bx,param_bx
mov cx,param_cx
mov dx,param_dx
mov es,param_ds
mov di,func};
MAIN0();
asm{ mov ra,ax
mov rb,bx
mov rc,cx
mov c,dx
popa};
break;
};
case 1:
{asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
mov ax,param_ax /* SI AND DI AS TEMP VAR */
mov bx,param_bx
mov cx,param_cx
mov dx,param_dx
mov es,param_ds
mov di,func};
MAIN1();
asm{ mov ra,ax
mov rb,bx
mov rc,cx
mov c,dx
popa};
break;
};
case 2:
{asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
mov ax,param_ax /* SI AND DI AS TEMP VAR */
mov bx,param_bx
mov cx,param_cx
mov dx,param_dx
mov es,param_ds
mov di,func};
MAIN2();
asm{ mov ra,ax
mov rb,bx
mov rc,cx
mov c,dx
popa};
break;
};
case 3:
{asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
mov ax,param_ax /* SI AND DI AS TEMP VAR */
mov bx,param_bx
mov cx,param_cx
mov dx,param_dx
mov es,param_ds
mov di,func};
MAIN3();
asm{ mov ra,ax
mov rb,bx
mov rc,cx
mov c,dx
popa};
break;
};
case 4:
{asm{ pusha /* VERY IMPORTANT, BECAUSE C USES */
mov ax,param_ax /* SI AND DI AS TEMP VAR */
mov bx,param_bx
mov cx,param_cx
mov dx,param_dx
mov es,param_ds
mov di,func};
MAIN4();
asm{ mov ra,ax
mov rb,bx
mov rc,cx
mov c,dx
popa};
break;
};
}
*handle= ra;
*param= rb;
return c;
}
//
//===========================================================================
//